package cn.arnold.sort;

import java.util.Arrays;

public class RadixSort {

    public static void main(String[] args) {
        int[] array = {128, 689, 792, 56, 482, 396, 521, 730};
        sort(array);
        System.out.println(Arrays.toString(array));
    }

    public static void sort(int[] array) {
        // 获取当前数组的最大数
        int max = array[0];
        for (int i = 0; i < array.length; i++) {
            if (array[i] > max) {
                max = array[i];
            }
        }
        // 获取最大数的位数
        int maxLength = (max + "").length();
        for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
            // 定义一个二维数组：表示10个桶，每个桶里有一个一位数组存放该桶的元素
            // 每个桶里有一个一位数组的长度不确定，最坏情况下为数组的长度（都排在了一个桶里）
            int[][] bucket = new int[10][array.length];
            // 定义一个一位数组：表示每个桶存放的元素的个数
            // 示例：bucketElementsCounts[0]表示bucket[0]桶里存放的数据的个数
            int[] bucketElementsCounts = new int[10];
            // 对每个元素的个位进行排序
            for (int j = 0; j < array.length; j++) {
                // 取出个位数
                int digitOfElements = array[j] / n % 10;    // 53%10=3; 542/100%10=5
                // 放入到对应的桶中
                bucket[digitOfElements][bucketElementsCounts[digitOfElements]] = array[j];
                bucketElementsCounts[digitOfElements]++;
            }
            // 将每个桶里的元素依次取出放入到array数组中
            int index = 0;
            for (int k = 0; k < 10; k++) {
                // 如果桶里有元素就取出
                if (bucketElementsCounts[k] != 0) {
                    for (int l = 0; l < bucketElementsCounts[k]; l++) {
                        array[index++] = bucket[k][l];
                    }
                }

            }
            System.out.println("第" + (i + 1) + "趟后：" + Arrays.toString(array));
        }

    }
}
